/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.colswe.testingProject.view;

import java.util.ArrayList;
import java.util.Collection;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import org.colswe.testingProject.control.SystemUserControl;
import org.colswe.testingProject.entity.*;

/**
 *
 * @author andres
 */
public class Main {

    private static EntityManagerFactory emf;

    public static void main(String[] args) {
        emf = Persistence.createEntityManagerFactory("TPPU");
        createApplicationType();
        createPrograms();
        createSystemOptions();
        createRoles();
        createUsers();
        System.out.println(SystemUserControl.sha256("Hola mundo"));
    }

    private static void createPrograms() {
        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();
        em.persist(new Program("Ingeniería de Sistemas"));
        em.persist(new Program("Ingeniería Agrícola"));
        em.persist(new Program("Ingeniería Civil"));
        em.persist(new Program("Ingeniería Eléctrica"));
        em.persist(new Program("Ingeniería Electrónica"));
        em.persist(new Program("Ingeniería Industrial"));
        em.persist(new Program("Ingeniería Química"));
        em.persist(new Program("Ingeniería Mecánica"));
        em.persist(new Program("Ingeniería Mecatrónica"));
        em.getTransaction().commit();
        em.close();
    }

    private static void createApplicationType() {
        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();
        em.persist(new ApplicationType("Devolución de matrícula"));
        em.persist(new ApplicationType("Inscripción extemporánea"));
        em.persist(new ApplicationType("Cancelación extemporánea de asignatura"));
        em.persist(new ApplicationType("Cancelación asignaturas sin pérdida de créditos"));
        em.persist(new ApplicationType("Cancelación del período académico"));
        em.persist(new ApplicationType("Autorización inscripción trabajo de grado"));
        em.persist(new ApplicationType("Inscripción trabajo de grado modalidad pasantía"));
        em.persist(new ApplicationType("Inscripción práctica estudiantil"));
        em.persist(new ApplicationType("Homologaciones"));
        em.persist(new ApplicationType("Convalidaciones"));
        em.persist(new ApplicationType("Equivalencias"));
        em.getTransaction().commit();
        em.close();
    }

    private static void createSystemOptions() {
        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();
        em.persist(new SystemOptions("Administrar usuarios del sistema"));
        em.persist(new SystemOptions("Radicar solicitudes"));
        em.persist(new SystemOptions("Buscar solicitud"));
        em.persist(new SystemOptions("Crear preacta de Comité Asesor"));
        em.persist(new SystemOptions("Registrar recomendación del Comité Asesor al Consejo de Facultad"));
        em.persist(new SystemOptions("Crear acta de Comité Asesor"));
        em.getTransaction().commit();
        em.close();
    }

    private static void createRoles() {
        EntityManager em = emf.createEntityManager();
        SystemRoles adm, sec, asis;
        Collection<SystemOptions> col = findOptions();
        adm = new SystemRoles("Administrador en el sistema");
        sec=new SystemRoles("Secretaria de la Coordinación Curricular");
        asis=new SystemRoles("Asistente de la Coordinación Curricular");
        Collection<SystemOptions> admo = new ArrayList<SystemOptions>();
        Collection<SystemOptions> seco = new ArrayList<SystemOptions>();
        Collection<SystemOptions> asiso = new ArrayList<SystemOptions>();
        for (SystemOptions op : col) {
            if(op.getName().equals("Administrar usuarios del sistema")) {
                admo.add(op);
            }
            if(op.getName().equals("Radicar solicitudes")) {
                seco.add(op);
            }
            if(op.getName().equals("Buscar solicitud")) {
                seco.add(op);
                asiso.add(op);
            }
            if(op.getName().equals("Crear preacta de Comité Asesor")) {
                asiso.add(op);
            }
            if(op.getName().equals("Registrar recomendación del Comité Asesor al Consejo de Facultad")) {
                asiso.add(op);
            }
            if(op.getName().equals("Crear acta de Comité Asesor")) {
                asiso.add(op);
            }
        }
        adm.setOptions(admo);
        sec.setOptions(seco);
        asis.setOptions(asiso);
        em.getTransaction().begin();
        em.persist(adm);
        em.persist(sec);
        em.persist(asis);
        em.getTransaction().commit();
        em.close();
    }

    private static Collection<SystemOptions> findOptions() {
        Collection<SystemOptions> col;
        EntityManager em = emf.createEntityManager();
        Query query = em.createQuery("SELECT u FROM SystemOptions AS u");
        em.getTransaction().begin();
        col = query.getResultList();
        em.getTransaction().commit();
        em.close();
        return col;
    }

    private static void createUsers() {
        Collection<SystemRoles> roles;
        SystemUser admin,sec,asis;
        admin=new SystemUser("admin", "Adminadmin01");
        sec=new SystemUser("secretaria", "Secretaria01");
        asis=new SystemUser("asistente", "Asistente01");
        EntityManager em = emf.createEntityManager();
        Query q=em.createQuery("SELECT u FROM SystemRoles AS u");
        em.getTransaction().begin();
        roles=q.getResultList();
        for(SystemRoles sr: roles) {
            if(sr.getName().equals("Administrador en el sistema")) {
                admin.setUserRole(sr);
            }
            if(sr.getName().equals("Secretaria de la Coordinación Curricular")) {
                sec.setUserRole(sr);
            }
            if(sr.getName().equals("Asistente de la Coordinación Curricular")) {
                asis.setUserRole(sr);
            }
        }
        em.persist(admin);
        em.persist(sec);
        em.persist(asis);
        em.getTransaction().commit();
        em.close();
    }
}
